package com.xjggb.动态数组;

import java.util.ArrayList;

@SuppressWarnings("unchecked")
public class ArrayLIst<E> implements com.xjggb.动态数组.List<E> {
    /**
     * 元素的数量
     */
    private int size;
    /**
     * 所有的元素
     */
    private E[] elements;
    /*
    * 定义长度为10
    * */
    private static final int DEFAULT_CAPACITY = 2;
    private static final int ELEMENT_NOT_FOUND = -1;

    /*
    * 动态数组初始化
    * */
    public ArrayLIst(int capaticy){

        ArrayList<String> strings = new ArrayList<String>();
//        判断传入的参数是否比默认值打小于默认值，就使用默认值
        capaticy=(capaticy<DEFAULT_CAPACITY)? DEFAULT_CAPACITY: capaticy;
//        创建数组
        elements=(E[]) new Object[capaticy];
    }

//    没有参数初始化
    public ArrayLIst(){
        this(DEFAULT_CAPACITY);
    }


//    元素的数量
    public int size() {
        return size;
    }

    // 是否为空
    public boolean isEmpty() {
        return size==0;
    }

//    是否包含某个元素
    public boolean contains(E element) {



         return indexOf(element) != ELEMENT_NOT_FOUND;
    }
// 添加元素
    public void add(E element) {
        add(size,element);
    }

    public E get(int index) {
        //        判断索引是否违法
        rangeCheckForAdd(index);
        return elements[index];
    }

    public E set(int index, E element) {
        //        判断索引是否违法
        rangeCheckForAdd(index);
        return elements[index]=element;
    }

//    在index位置插入元素
    public void add(int index, E element) {
//        判断索引是否违法
        rangeCheckForAdd(index);

        ensureCapacity(size+1);
//        把数据往后移动
        for (int i = size; i >index; i--) {
            elements[i]=elements[i-1];
        }
        elements[index]=element;
        size++;
    }
//    根据index位置删除元素
    public E remove(int index) {
//        检查索引
        rangeCheck(index);
        E element = elements[index];
        for (int i = index+1; i < size; i++) {
            elements[i-1]=elements[i];
        }
        elements[--size]=null;
        return element;
    }

//    查看索引
public int indexOf(E element) {
    if (element == null) {  // 1
        for (int i = 0; i < size; i++) {
            if (elements[i] == null) return i;
        }
    } else {
        for (int i = 0; i < size; i++) {
            if (element.equals(elements[i])) return i; // n
        }
    }
    return ELEMENT_NOT_FOUND;
}


//清除所有
    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i]=null;
        }
        size=0;

    }
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /*
    * 扩容
    * */
//    传入size
    private void ensureCapacity(int capacity) {
        int oldCapacity  = elements.length;
        if (oldCapacity>=capacity)return;

//        新增容量 1.5倍   >>
        int newCapacity = oldCapacity + (oldCapacity >> 1);

        E[] newElements = (E[]) new Object[newCapacity];

        for (int i = 0; i < size; i++) {
            newElements[i]=elements[i];
        }
        elements=newElements;
        System.out.println("oldCapacity:"+"扩容"+newCapacity);
    }
//    判断传入的索引是否合法
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
    }


    @Override
    public String toString() {
        StringBuilder string = new StringBuilder();
        string.append("size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            if (i != 0) {
                string.append(", ");
            }
            string.append(elements[i]);
        }
        string.append("]");
        return string.toString();
    }
}
